'''
进程 进行中的程序，多个进程之间看似并发运行，实际上（cpu非常快速交替执行不同进程，看起来像并发）
创建进程
    1. linux/mac 下： is模块 fork函数
    2. windows下：Process
Process(group=None,target,name,args,kwargs)
    1. group: 分组，实际上不使用，默认None
    2. target: 子进程要执行的任务，支持函数名
    3. name: 子进程的名称
    4. args:    调用函数的位置参数，元组
    5. kwargs:  调用函数的关键字参数，dict
'''
from multiprocessing import Process,Pool,Queue
import os,time

# def test():
#     print(f'当前执行进程pid：{os.getpid()},父进程是{os.getppid()}')

# if __name__ == '__main__':
#     lst = []
#     for i in range(5):
#         p = Process(target=test)
#         p.start() # 开启进程
#         lst.append(p)
#     print("主进程执行结束")

'''
常用进程属性/方法
name            当前进程实例别名 默认Process-N
pid             当前进程pid
is_alive()      是否存活，执行完为False
join(timeout)   等待结束或者等待timeout秒
start()         启动进程
run()           没有指定target参数，启动进程后，会调用父类的run方法
terminate()     强制终止进程
'''
'''
继承式创建子进程
'''
class MyProcess(Process):
    def __init__(self,name):
        super().__init__()
        self.name = name
    def run(slf):
        print("zjzj",slf.name)

if __name__ == '__main__':        
    lst = []
    for i in range(5):
        p = MyProcess(f'pppp{i}')
        p.start()
    for i in lst:
        i.join()
    print("结束")

'''
进程池：管理进程用的
    multiProccess Pool类
        apply_async(func,args,kwargs)       非阻塞方式调用func
        apply(func,args,kwargs)             阻塞方式调用func
        close()                             关闭进程池 不再接收新任务
        terminate()                         立即终止
        join()                              阻塞主进程，terminrate()/close()之后使用
'''

'''
进程间的数据不共享,
但是可以通过队列来实现进程通信
multiProccess  Queue       
    Queue(N)                创建一条容量为N的队列
    qsize()                 当前对象消息数量
    empty()                 队列是否为空
    full()                  队列是否满了
    get(block=True,timeout=n)         获取一条并出队，block是否阻塞式获取，空了等待有数据再拿 有timeout则等待n秒抛异常
    get_nowait()            相当于get(block=False) 队列为空时会抛异常
    put(item,block=True,timeout=n)    入队一条，block是否阻塞式获取，满了等待空闲 有timeout则等待n秒抛异常
    put_nowait(item)        put(item,block=False) 满了会抛异常
队列实现进程通信（消息队列）
'''
q = Queue(10)
a = 100
def put_msg(q):
    global a
    if not q.full():
        for i in range(5):
            a -= 20
            q.put(a)
            print("a入队：",a)
def get_msg(q):
    global a
    while not q.empty():
        time.sleep(1)
        a = q.get()
        print("a出队",a)

if __name__ == '__main__':
    p1 = Process(target = put_msg,args = (q,))
    p2 = Process(target = get_msg,args = (q,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print("结束")